import axios from 'axios'
// import qs from 'qs'
import { Toast } from 'vant'
import router from '@/router/index'
import store from '@/store/index'
// import signMd5Utils from '@/utils/sign'


let url = process.env.VUE_APP_Verison + "/";//生产
if (process.env.NODE_ENV === "development") {
  url = "/apis/quest-api" //开发
}
const toLogin = () => {
  router.push({
    path: '/login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  })
};

const api = axios.create({
  baseURL: url,
  timeout: 100000,
  responseType: 'json',
  withCredentials: false,
  headers: {
    'Content-Type': 'application/json',
  }
});
// api.defaults.headers.common["client_id"]="webApp"
// api.defaults.headers.common["client_secret"]="webApp"
// api.defaults.headers.post['Content-Type'] =
//   'application/x-www-form-urlencoded;charset=UTF-8'
api.interceptors.request.use(
  request => {
    /**
     * 全局拦截请求发送前提交的参数
     * 以下代码为示例，在登录状态下，分别对 post 和 get 请求加上 token 参数
     */
    request.headers.Authorization = "";
    if (sessionStorage.getItem("backLoginToken")) {

      request.headers.Authorization = "Bearer " + sessionStorage.getItem("backLoginToken");
    }

    if (store.getters['user/isLogin']) {
      request.headers.token = store.state.user.token
    }
    return request
  }
);


api.interceptors.response.use(
  async response => {
    /**
     * 全局拦截请求发送后返回的数据，如果数据有报错则在这做全局的错误提示
     * 假设返回数据格式为：{"code":500,"msg":"邮箱地址不正确","data":null}
     * 规则是当 code 为 200 时表示请求成功，500 发生错误
     * 为 401 时表示接口需要登录或者登录状态失效，需要重新登录
     * 请求出错时 msg 会返回错误信息
     * 则代码如下
     */
    response.headers.Access = "Access-Control-Allow-Origin"
    let errCodes = [500, 405, 403];
    const res = response.data;

    if (res.code === 200) {
      return Promise.resolve(res)
    } else if (errCodes.includes(res.code)) {
      // 这里做错误提示，如果使用了 element ui 则可以使用 Message 进行提示
      Message({
        message: res.msg || 'Error',
        type: 'error',
        duration: 5 * 1000
      });
      return Promise.reject(res)
    } else if (res.code === 401) {

      // 有一个接口进入该方法 其他接口则不在进入
      let reLogin = store.getters['global/isReLogin'];
      if (!reLogin) {
        store.dispatch('global/loginExpired', true).then(() => {
          // to re-login
          MessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            toLogin();
            sessionStorage.removeItem("token");
            sessionStorage.removeItem("userInfo");
            sessionStorage.removeItem("backLoginToken");
            // if (router.app._route.path.includes('peoLifeManage')) {
            router.push("/login");
            // 重置状态
            this.$store.dispatch('global/loginExpired', false).then(() => {
            })
          }).catch(() => {

          })
        })
      }
      return Promise.reject(res)
    }
    return Promise.resolve(res)
  },
  error => {

    if (error.response) {
      this.$message({
        message: error.response.data.msg,
        type: 'error'
      });
    } else {
      this.$message({
        message:'服务开小差了，请稍后再试',
        type: 'error'
      });
    }

    //
    // sessionStorage.removeItem("token");
    // sessionStorage.removeItem("userInfo");    toLogin()

    return Promise.reject(error)
  }
);

export default api
